package com.hyl.controller;

import com.hyl.entity.SysUser;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @Description TODO
 * @Author hyl
 * @Date 2023/5/15 9:47
 **/
@Controller
@RequestMapping("/user")
public class UserController {

	private Logger logger = Logger.getLogger(UserController.class);

	@GetMapping("/list")
	public String list(@RequestParam(defaultValue = "1") Integer cuurentPage,
	                   Model  model){
		List<SysUser> list = new ArrayList<>();
		for(int i=0;i<10;i++){
			SysUser tmp = new SysUser();
			tmp.setId(i+1);
			tmp.setAccount("A_"+i);
			tmp.setRealName("张三"+i);
			list.add(tmp);
		}
		//数据传递
		model.addAttribute("userList", list);
		return "user/list";//视图名称
	}

	@GetMapping("/del")
	public String del(Integer id){
		//删除
		return "redirect:list";//重定向
	}




	@GetMapping("/delete/{id}") //rest风格==》{id}==>占位符==》将数据通过@PathVariable注解注入到参数中
	public String delete(@PathVariable(name = "id") Integer id){
		//删除
		System.out.println("删除。。"+id);
		return "redirect:list";//重定向
	}


	@GetMapping("/toadd")
	public String toadd(){
		//删除
		return "user/add";//视图名称
	}

	//@Valid校验实体类中属性的值或格式是否正确。
	// 如果后面参数没有BindingResult，则直接异常。
	// 配置BindingResult，则错误信息会进入参数中，执行if中的逻辑判断，进行页面跳转。可使用Spring标签<fm:error/>显示验证错误
	@PostMapping("/add1")
	public String add1(@Valid SysUser user, BindingResult bindingResult){ //数据封装，校验
		//数据验证
		if(bindingResult.hasErrors()){
			System.out.println("数据校验出错");
			return "user/add";//视图名称
		}
		System.out.println("新增");
		return "redirect:list";//重定向
	}


	@PostMapping("/add")
	public String add(@Valid SysUser user, HttpServletRequest request,
	                  //特殊的表单元素：文件域
	                  @RequestParam(value ="idPic", required = false) MultipartFile idPic){

		String idPicPath = null;
		//判断文件是否为空
		if(!idPic.isEmpty()){
			String path = request.getSession().getServletContext().getRealPath("statics"+ File.separator+"uploadfiles");
			System.out.println("上传文件路径"+path);

			String originalFile = idPic.getOriginalFilename();//原文件名
			System.out.println("源文件名为："+originalFile);

			String prefix= originalFile.substring(originalFile.lastIndexOf(".")+1);//原文件后缀
			System.out.println("原文件后缀为：" + prefix);

			int filesize = 20*1024*1024;
			System.out.println("文件大小：" + idPic.getSize());

			if(idPic.getSize() >  filesize){//上传大小不得超过 500k
				request.setAttribute("uploadFileError", " * 上传大小不得超过 500k");
				System.out.println("c超过指定大小：");
				return "user/add";
			}else if(prefix.equalsIgnoreCase("jpg") || prefix.equalsIgnoreCase("png")
					|| prefix.equalsIgnoreCase("jpeg") || prefix.equalsIgnoreCase("pneg")){//上传图片格式不正确
				String fileName = System.currentTimeMillis()+ (new Random()).nextInt(100000)+"_Personal." + prefix;
				System.out.println("新生成的文件名称为：" + idPic.getName());
				File targetFile = new File(path);
				if(!targetFile.exists()){
					targetFile.mkdirs();
				}
				//保存
				try {
					idPic.transferTo(new File(targetFile, fileName));
				} catch (Exception e) {
					e.printStackTrace();
					request.setAttribute("uploadFileError", " * 上传失败！");
					return "user/add";
				}
				idPicPath = File.separator+"statics"+ File.separator+"uploadfiles" + File.separator+fileName;
				user.setIdPicPath(idPicPath); //写入到实体类中
				//操作service，实现持久化操作
			}else{
				request.setAttribute("uploadFileError", " * 上传图片格式不正确");
				return "user/add";
			}
		}
		return "redirect:list";//重定向
	}
}
